package cn.drenal.capcap.service;

import cn.drenal.capcap.entity.Artwork;
import cn.drenal.capcap.entity.dto.ArtworkSubmitDTO;
import cn.drenal.capcap.entity.vo.ArtworkListVO;
import cn.drenal.capcap.entity.vo.ArtworkDetailVO;
import cn.drenal.capcap.entity.vo.forum.ForumArtworkCardVO;
import cn.drenal.capcap.entity.vo.forum.ForumArtworkDetailVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * 作品服务接口
 */
public interface ArtworkService extends IService<Artwork> {
    /**
     * 创建作品
     *
     * @param artwork 作品信息
     * @return 创建结果
     */
    Artwork createArtwork(Artwork artwork);

    /**
     * 更新作品
     *
     * @param id 作品ID
     * @param artwork 作品信息
     * @return 更新结果
     */
    Artwork updateArtwork(Long id, Artwork artwork);

    /**
     * 删除作品
     *
     * @param id 作品ID
     */
    void deleteArtwork(Long id);

    /**
     * 根据ID查询作品
     *
     * @param id 作品ID
     * @return 作品信息
     */
    Artwork getArtworkById(Long id);
    
    /**
     * 根据ID查询作品详情
     *
     * @param id 作品ID
     * @return 作品详情视图对象
     */
    ArtworkDetailVO getArtworkDetailById(Long id);

    /**
     * 分页查询作品列表
     *
     * @param page 分页参数
     * @param title 标题（可选）
     * @param status 状态（可选）
     * @param categoryId 分类ID（可选）
     * @param activityId 活动ID（可选）
     * @return 作品分页列表
     */
    Page<ArtworkListVO> getArtworkPage(Page<ArtworkListVO> page, String title, Integer status, Long categoryId, Long activityId);
    Page<ArtworkListVO> getArtworkPage(Page<ArtworkListVO> page, Long categoryId, Long tagId);
    /**
     * 审核作品
     *
     * @param id 作品ID
     * @param status 审核状态
     * @param rejectReason 拒绝原因（当状态为拒绝时必填）
     * @return 更新后的作品
     */
    Artwork reviewArtwork(Long id, Integer status, String rejectReason);
    
    /**
     * 增加作品浏览量
     *
     * @param id 作品ID
     */
    void incrementViewCount(Long id);

    /**
     * 提交作品
     *
     * @param artworkSubmitDTO 作品提交信息
     * @param userId 用户ID
     * @return 作品实体
     */
    Artwork submitArtwork(ArtworkSubmitDTO artworkSubmitDTO, Long userId);

    /**
     * 获取最新作品列表
     *
     * @param page 分页参数
     * @return 作品卡片列表
     */
    Page<ForumArtworkCardVO> getLatestArtworks(Page<Artwork> page);
    
    /**
     * 获取评论数最多的作品列表
     *
     * @param limit 限制数量
     * @return 作品卡片列表
     */
    List<ForumArtworkCardVO> getTopArtworksByCommentCount(int limit);
    
    /**
     * 获取收藏数最多的作品列表
     *
     * @param limit 限制数量
     * @return 作品卡片列表
     */
    List<ForumArtworkCardVO> getTopArtworksByFavoriteCount(int limit);
    
    /**
     * 获取综合评分最高的作品列表（评论数 + 收藏数*10）
     *
     * @param limit 限制数量
     * @return 作品卡片列表
     */
    List<ForumArtworkCardVO> getTopArtworksByComprehensiveScore(int limit);

    /**
     * 获取萌新求助作品列表
     *
     * @param page 分页参数
     * @return 作品列表
     */
    Page<Artwork> getHelpArtworks(Page<Artwork> page);

    /**
     * 获取论坛作品详情
     *
     * @param id 作品ID
     * @param userId 当前用户ID，可为null
     * @return 作品详情
     */
    ForumArtworkDetailVO getForumArtworkDetail(Long id, Long userId);

    /**
     * 点赞或取消点赞作品
     *
     * @param artworkId 作品ID
     * @param userId 用户ID
     * @return 点赞状态
     */
    boolean toggleArtworkLike(Long artworkId, Long userId);

    /**
     * 获取作品的点赞数
     *
     * @param artworkId 作品ID
     * @return 点赞状态
     */
    Integer getLikeCount(Long artworkId);

    /**
     * 获取推荐作品列表
     * 按照真实点赞数降序排序
     *
     * @param page 分页参数
     * @return 作品卡片列表
     */
    Page<ForumArtworkCardVO> getRecommendedArtworks(Page<Artwork> page);
}